//package com.chao.common.util.doc;
//
//import com.chao.common.util.DateUtile;
//import com.chao.common.util.ListUtile;
//import com.chao.common.util.StrUtile;
//import com.chao.common.util.doc.FileUtile;
//import com.chao.common.util.doc.bean.Modular;
//import com.chao.common.util.doc.bean.ModularField;
//import com.chao.common.util.doc.bean.ModularMethod;
//import com.sun.javadoc.*;
//import com.sun.tools.javadoc.Main;
//
//import java.io.File;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * 解析代码 获取模块 包名和类名
// */
//public class TreeUtil {
//
//    public static final char S = File.separatorChar;
//
//    private static RootDoc rootDoc;
//
//    /**
//     * 解析结果接收类
//     */
//    public static class Doclet {
//        public static boolean start(RootDoc rootDoc) {
//            TreeUtil.rootDoc = rootDoc;
//            return true;
//        }
//    }
//
//    /**
//     * 遍历代码文件夹 扫描接口
//     */
//    public static void selectPage(List<Modular> modularList, File folder){
//        if (!folder.isDirectory()) {
//            return;
//        }
//        String[] folderList = folder.list();
//        if(null == folderList){
//            return;
//        }
//        List<ModularField> fieldList = new ArrayList<>();
//        for (String file : folderList) {
//            if ("controller".equals(file)) {
//                addModular(modularList, new File(folder, file),folder);
//            } else if ("bean".equals(file)) {
//                addFieldList(fieldList, new File(folder, file));
//            } else {
//                selectPage(modularList, new File(folder, file));
//            }
//        }
//        // 去重
//        if(!ListUtile.isEmpty(fieldList)){
//            modularList.get(0).setFieldList(fieldList.stream().distinct().collect(Collectors.toList()));
//        }
//    }
//
//    public static void addFieldList(List<ModularField> fieldList,File folder){
//        String[] folderList = folder.list();
//        if(null == folderList){
//            return;
//        }
//        for (String file : folderList) {
//            fieldList.addAll(selectBean(new File(folder, file).getPath()));
//        }
//    }
//
//    /**
//     * 遍历代码文件夹 获取文件最新修改时间
//     */
//    public static long selectPageTime(List<String> relyList,long time,File folder){
//        if (!folder.isDirectory()) {
//            List<String> strs = FileUtile.readFileByLine(folder);
//            String page = null;
//            for (String str : strs) {
//                if (null == page && str.contains("package ")) {
//                    page = str.substring(str.indexOf("modular.")+8);
//                    page = page.substring(0,page.indexOf("."));
//                }
//                if(str.contains("import ") && str.contains("modular.") && !str.contains("modular."+page)){
//                    String s = str.substring(str.indexOf("modular.")+8);
//                    relyList.add(s.substring(0,s.indexOf(".")));
//                }
//                if(str.contains("public ")){
//                    break;
//                }
//            }
//
//            return Math.max(time, folder.lastModified());
//        }
//        String[] folderList = folder.list();
//        if(null == folderList){
//            return time;
//        }
//        for (String file : folderList) {
//            long t = selectPageTime(relyList,time,new File(folder, file));
//            if(time < t){
//                time = t;
//            }
//        }
//        return time;
//    }
//
//    /**
//     * 解析 controller
//     */
//    public static void addModular(List<Modular> modularList,File folder,File page){
//        String[] folderList = folder.list();
//        if(null == folderList){
//            return;
//        }
//        List<String> relyList = new ArrayList<>();
//        String lastTime = DateUtile.toYmdhms(new Date(selectPageTime(relyList,0,page)));
//        String pageStr = null;
//        for (int i = 0; i < folderList.length; i++) {
//            String file = folderList[i];
//            Modular modular = TreeUtil.getModular(new File(folder, file),lastTime,i+"");
//            pageStr = modular.getModularPage();
//            modularList.add(modular);
//        }
//        if(!ListUtile.isEmpty(relyList) && null != pageStr){
//            relyList = relyList.stream().distinct().collect(Collectors.toList());
//            List<ModularMethod> abilityList = new ArrayList<>();
//            for (String s : relyList) {
//                ModularMethod ability = new ModularMethod();
//                ability.setSpareField9(pageStr); // 主模块
//                ability.setMethodPath(s); // 关联模块
//                abilityList.add(ability);
//            }
//            if(null == modularList.get(0).getRelyList()){
//                modularList.get(0).setRelyList(abilityList);
//            }else {
//                modularList.get(0).getRelyList().addAll(abilityList);
//            }
//        }
//    }
//
//    /**
//     * 解析封装
//     */
//    public static Modular getModular(File file,String lastTime,String ii)
//    {
//        String javaPath = file.getPath();
//        //lastModified
//        // 解析接口
//        Modular modular = selectController(javaPath,ii);
//
//        String modularPage = javaPath.substring(javaPath.lastIndexOf("modular")+8,javaPath.lastIndexOf("controller")-1).replace(S,'.');
//        modular.setModularPage(modularPage);
//        if(modularPage.contains(".")){
//            modular.setModularPath(modularPage.split("\\.")[0]);
//        }else {
//            modular.setModularPath(modularPage);
//        }
//        modular.setLastTime(lastTime);
//        return modular;
//    }
//
//    /**
//     * 查询实体的属性列表
//     */
//    public static List<ModularField> selectBean(String filename) {
//        String name = Doclet.class.getName();
//        Main.execute(name, name, new String[]{"-encoding", "utf-8", "-sourcepath",
//                filename,filename
//        });
//        List<String> strs = FileUtile.readFileByLine(new File(filename));
//        Map<String,String> strMap = new HashMap<>();
//        for (String str : strs) {
//            if (str.contains("List<") && str.contains("private")  && str.contains(";")) {
//                strMap.put(str.substring(str.indexOf("> ")+2,str.indexOf(";")),str.substring(str.indexOf("<")+1,str.indexOf(">")));
//            }
//        }
//        List<ModularField> fieldList = new ArrayList<>();
//        ClassDoc[] classes = rootDoc.classes();
//        for (ClassDoc classDoc : classes) {
//            FieldDoc[] fields=classDoc.fields(false);
//            for (int i = 0; i < fields.length; i++) {
//                FieldDoc fieldDoc = fields[i];
//                ModularField field = new ModularField();
//                if(i == 0){
//                    field.setIsKey("1");
//                }else {
//                    field.setIsKey("0");
//                }
//                field.setFieldSort((i+1)+"");
//                field.setFieldClass(classDoc.name());
//                field.setFieldName(fieldDoc.name());
//                field.setFieldComment(fieldDoc.commentText());
//                field.setFieldType(fieldDoc.type().typeName());
//                if("List".equals(field.getFieldType())){
//                    field.setClassName(strMap.get(field.getFieldName()));
//                }
//                if(fieldDoc.type().toString().contains("java.")){
//                    field.setIsBean("1");
//                }else {
//                    field.setIsBean("2");
//                    field.setClassName(field.getFieldType());
//                }
//                fieldList.add(field);
//            }
//        }
//        return fieldList;
//    }
//
//    /**
//     * 查询接口列表
//     */
//    public static Modular selectController(String filename,String ii) {
//        String name = Doclet.class.getName();
//        Main.execute(name, name, new String[]{"-encoding", "utf-8", "-sourcepath",
//                filename,filename
//        });
//
//        Modular modular = new Modular();
//        modular.setModularId(StrUtile.getId());
//        List<ModularMethod> methodList = new ArrayList<>();
//
//        List<String> strs = FileUtile.readFileByLine(new File(filename));
//
//
//        ClassDoc[] classes = rootDoc.classes();
//        for (int i = 0; i < classes.length; i++) {
//            ClassDoc classDoc = classes[i];
//            MethodDoc[] methods=classDoc.methods();
////            AnnotationDesc[] bb = classDoc.annotations();
//            // 解析接口类路径 linux 下无法解析注解参数 废弃
////            for (AnnotationDesc annotationDesc : bb) {
////                if("RequestMapping".equals(annotationDesc.annotationType().name())){
////                    AnnotationDesc.ElementValuePair[] e = annotationDesc.elementValues();
////                    for (AnnotationDesc.ElementValuePair e1 : e) {
////                        if("value".equals(e1.element().name())){
////                            modular.setMethodPath(e1.value().toString().replace("\"",""));
////                        }
////                    }
////                }
////            }
////
//
//            // 解析接口类路径
//            for (int s = 0; s < strs.size(); s++) {
//                if(strs.get(s).contains("public class ")){
//                    for (int d = s; d > 0; d--) {
//                        if(strs.get(d).contains("RequestMapping")){
//                            modular.setMethodPath(strs.get(d).substring(strs.get(d).indexOf("\"")+1,strs.get(d).lastIndexOf("\"")));
//                            break;
//                        }
//                    }
//                    break;
//                }
//            }
//
//            modular.setModularName(classDoc.commentText().replace("Controller","").split("\n")[0]);
//
//            for (int j = 0; j < methods.length; j++) {
//
//                MethodDoc methodDoc = methods[j];
//                ModularMethod method = new ModularMethod();
//                method.setMethodSort(ii + (j+1));
//                method.setMethodName(methodDoc.name());
//                method.setMethodComment(methodDoc.commentText());
//                String ret =  methodDoc.returnType().toString();
//                method.setMethodReturn(ret.substring(ret.lastIndexOf(".")+1));
//                Parameter[] parameters = methodDoc.parameters();
//                method.setMethodParameter(Arrays.stream(parameters).map(p -> p.type().toString().substring(p.type().toString().lastIndexOf(".")+1)).collect(Collectors.joining(",")));
//                // 解析注解参数
//                for (int s = 0; s < strs.size(); s++) {
//                    if(strs.get(s).contains(" "+methodDoc.name() + "(")){
//                        if(strs.get(s).contains("public PageList") || strs.get(s).contains("public List")){
//                            method.setMethodReturn(strs.get(s).substring(strs.get(s).indexOf("public ")+7).split(methodDoc.name())[0].trim());
//                        }else if(strs.get(s).contains("List<")){
//                            String v = strs.get(s).substring(strs.get(s).indexOf("(")+1,strs.get(s).indexOf(")")).replace("@RequestParam ","").replace("@RequestBody ","");
//                            if(v.contains(",")){ // 如果有多个入参
//                                List<String> ass = new ArrayList<>();
//                                String[] as = v.split(",");
//                                for (String a : as) {
//                                    ass.add(a.split(" ")[0]);
//                                }
//                                method.setMethodParameter(StrUtile.join(ass,","));
//                            }else {
//                                method.setMethodParameter(v.split(" ")[0]);
//                            }
//                        }
//                        for (int d = s; d > s-5; d--) {
//                            if(!StrUtile.isEmpty(method.getMethodType()) && !StrUtile.isEmpty(method.getMethodCode())){
//                                break;
//                            }
//                            if(strs.get(d).contains("RequestMapping")){
//                                String v = strs.get(d);
//                                method.setMethodType(v.substring(v.indexOf(".")+1,v.indexOf(",")));
//                                method.setMethodPath(v.substring(v.indexOf("\"")+1,v.lastIndexOf("\"")));
//                            }
//                            // 解析接口说明
//                            if(strs.get(d).contains("Inter")){
//                                String[] v = strs.get(d).split(",");
//                                if(v.length == 1){ // 只配置接口编码
//                                    method.setMethodCode(v[0].substring(v[0].indexOf("\"")+1,v[0].lastIndexOf("\"")));
//                                    method.setMethodGrade("2");
//                                    method.setMethodAnswer(true);
//                                }else {
//                                    for (String value : v) {
//                                        if (value.contains("value")) {
//                                            method.setMethodCode(value.substring(value.indexOf("\"") + 1, value.lastIndexOf("\"")));
//                                        } else if (value.contains("grade")) {
//                                            method.setMethodGrade(value.substring(value.indexOf("\"") + 1, value.lastIndexOf("\"")));
//                                        } else if (value.contains("false")) {
//                                            method.setMethodAnswer(false);
//                                        } else if (value.contains("true")) {
//                                            method.setMethodAnswer(true);
//                                        }
//                                    }
//                                    if(StrUtile.isEmpty(method.getMethodGrade())){
//                                        method.setMethodGrade("2");
//                                    }
//                                    if(StrUtile.isEmpty(method.getMethodAnswer())){
//                                        method.setMethodAnswer(true);
//                                    }
//                                }
//                            }
//                        }
//                        break;
//                    }
//                }
//                //linux 下无法解析注解参数 废弃
////                AnnotationDesc[] aa = methodDoc.annotations();
////                for (AnnotationDesc annotationDesc : aa) {
////                    if("RequestMapping".equals(annotationDesc.annotationType().name())){
////                        AnnotationDesc.ElementValuePair[] e = annotationDesc.elementValues();
////                        for (AnnotationDesc.ElementValuePair e1 : e) {
////                            if("method".equals(e1.element().name())){
////                                String v = e1.value().toString();
////                                method.setMethodType(v.substring(v.lastIndexOf(".")+1));
////                            }
////                            if("value".equals(e1.element().name())){
////                                method.setMethodPath(e1.value().toString().replace("\"",""));
////                            }
////                        }
////                    }
////                    if("Inter".equals(annotationDesc.annotationType().name())){
////                        AnnotationDesc.ElementValuePair[] e = annotationDesc.elementValues();
////                        for (AnnotationDesc.ElementValuePair e1 : e) {
////                            if("value".equals(e1.element().name())){
////                                method.setMethodCode(String.valueOf(e1.value().value()));
////                            }
////                            if("grade".equals(e1.element().name())){
////                                method.setMethodGrade(String.valueOf(e1.value().value()));
////                            }
////                            if("answer".equals(e1.element().name())){
////                                method.setMethodAnswer((Boolean)e1.value().value());
////                            }
////                        }
////                    }
////                }
//                methodList.add(method);
//            }
//        }
//        modular.setMethodList(methodList);
//        return modular;
//    }
//}
